package LuMin.udp.dicyionary_service;

/**
 * @author lumin
 * @date 2022/05/11 21:17
 **/
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Arrays;
import java.util.HashMap;

public class Server {
    // 1. 写在文件中
    // 2. 写在数据库中
    private static final HashMap<String, String> map = new HashMap<>();
    static {
        map.put("apple", "苹果");
        map.put("banana", "香蕉");
    }

    public static void main(String[] args) throws IOException {
        Log.println("服务器 bind 在 8080 端口上");
        DatagramSocket socket = new DatagramSocket(5678);
        while (true) {
            // 读取请求
            byte[] buf = new byte[1024];
            DatagramPacket received = new DatagramPacket(buf, buf.length);

            Log.println("服务器准备接收数据");
            socket.receive(received);       // 服务器会阻塞
            Log.println("服务器接收到了数据");
            // 处理
            // 对方的地址（ip）
            InetAddress address = received.getAddress();
            Log.printf("对方的地址是: %s\r\n", address);
            // 对方的端口（port）
            int port = received.getPort();
            Log.printf("对方的端口是: %d\r\n", port);
            // 真正收到的数据长度
            int n = received.getLength();
            Log.printf("一共收到的数据长度: %d\r\n", n);
            // 真正有用的数据
            byte[] actualData = Arrays.copyOf(buf, n);
            // byte[] + 字符集编码 -> String
            String request = new String(actualData, 0, actualData.length, "UTF-8");
            Log.printf("请求是: %s\r\n", request);
            // 分析请求
            if (!request.startsWith("我是Java19班的\r\n")) {
                // 不符合应用层的请求协议，不做处理
                Log.println("请求头不符合格式");
                continue;
            }

            if (!request.endsWith("\r\n")) {
                // 不符合应用层的请求协议，不做处理
                Log.println("请求尾不符合格式");
                continue;
            }

            String englishWord = request.substring("我是Java19班的\r\n".length(), request.length() - 2);

            Log.println("收到的英文单词是: " + englishWord);
            String chineseWord = map.getOrDefault(englishWord, "不认识");
            Log.println("翻译后的中文是: " + chineseWord);

            // 发送响应
            String response = String.format("好的\r\n%s\r\n", chineseWord);
            Log.println("响应是: " + response);
            // String + 字符集编码 -> byte[]
            byte[] bytes = response.getBytes("UTF-8");

            Log.println("准备发送响应");
            DatagramPacket sent = new DatagramPacket(
                    bytes, 0, bytes.length,
                    address,
                    port
            );
            socket.send(sent);

            Log.println("响应发送成功");
        }
    }
}
